
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc, char *argv[])
{
    if (argc < 2) {
        printf("input file name. (eg: cat_file status_info)\n");
        return -1;
    }
    // 触发userlayer_proc中inotify的事件
    // chmod
    chmod(argv[1], S_IRUSR | S_IWUSR);
    // 延时是保证inotify收到了事件并对文件LOCK_EX
    usleep(1000);
    
    // 打开需要查看的文件
    FILE *file_fd = fopen(argv[1], "r+");
    if (file_fd == NULL) {
        printf("open %s fial.\n", argv[1]);
        return -1;
    }

    // 获取描述符
    int descriptor = fileno(file_fd);
    // 当userlayer_proc操作文件时会加锁，此处就会阻塞等待
    if(0 != flock(descriptor, LOCK_EX)){
        printf("flock(descriptor, LOCK_EX) fail.\n");
    }

    if(0 != flock(descriptor, LOCK_UN)){
        printf("flock(descriptor, LOCK_UN) fail.\n");
    }

    // userlayer操作完成后，读取文件内容并输出到终端
    char file_buf[2048] = {0};
    size_t file_size = fread(file_buf, 1, sizeof(file_buf), file_fd);
    if (file_size > 0) {
        printf("%s", file_buf);
    }
    else {
        printf("%s: null\n", argv[1]);
    }
    fclose(file_fd);
    
    return 0;
}